home *** CD-ROM | disk | FTP | other *** search
/ PCGUIA 117 / PC Guia 117.iso / Software / Utils / Software6 / Product13 / googlebar-0.9.5.06-fx.xpi / chrome / googlebar.jar / content / googlebarDragAndDrop.js < prev    next >
Text File  |  2005-02-20  |  7KB  |  255 lines

  1. var defaultOrder = [
  2.   "cust-menu", "gbsearch-separate", "site-separate", "lucky-separate", "images-separate",
  3.   "groups-separate", "directory-separate", "news-separate", "answers-separate", "scholar-separate",
  4.   "catalog-separate", "froogle-separate", "stocks-separate", "unclesam-separate", "viewer-separate",
  5.   "webquotes-separate", "dictionary-separate", "glossary-separate", "bsd-separate", "linux-separate",
  6.   "mac-separate", "microsoft-separate", "separator1", "gb-options-separate", "spec-menu",
  7.   "comp-menu", "univ-button", "separator2", "extras-box", "info-menu",
  8.   "cached-separate", "similar-separate", "backwards-separate", "translate-separate", "up-dir-button",
  9.   "nav-box", "separator3", "highlightplus-button", "highlight-button", "gblogger-separate",
  10.   "nocalc-separate", "gb-prefill-separate", "gb-mycountry-separate", "gb-mylocal-separate"
  11. ];
  12.  
  13. var customOrder;
  14.  
  15. var creator = null;
  16. var parentID = "googlebar-buttons";
  17.  
  18. var btnDragObserverOff = {
  19. };
  20.  
  21. var btnDragObserverOn = {
  22.  
  23.   getSupportedFlavours: function ()
  24.   {
  25.     var flavours = new FlavourSet();
  26.     flavours.appendFlavour("text/unicode");
  27.     return flavours;
  28.   },
  29.  
  30.   onDragExit: function (evt, session)
  31.   {
  32.       myGooglebarUtil.updateClass(evt.target, 1, "dragbordernone");
  33.   },
  34.  
  35.   onDragOver: function (evt, flavour, session)
  36.   {
  37.     if (creator == evt.target.getAttribute("id") || creator == "invalid")
  38.     {
  39.       return;
  40.     }
  41.  
  42.     var halfX = evt.target.boxObject.x + (evt.target.boxObject.width / 2);
  43.  
  44.     if (evt.pageX < halfX)
  45.     {
  46.       myGooglebarUtil.updateClass(evt.target, 1, "dragborderleft");
  47.     }
  48.     else
  49.     {
  50.       myGooglebarUtil.updateClass(evt.target, 1, "dragborderright");
  51.     }
  52.   },
  53.  
  54.   onDragStart: function (evt, transferData, action)
  55.   {
  56.     if (evt.target.tagName == "menuitem")
  57.     {
  58.       creator = "invalid";
  59.       return;
  60.     }
  61.  
  62.     var txt = evt.target.getAttribute("id");
  63.     creator = txt;
  64.     transferData.data = new TransferData();
  65.     transferData.data.addDataForFlavour("text/unicode", txt);
  66.  
  67.     if ((evt.target.getAttribute("type") == "menu" || evt.target.getAttribute("type") == "menu-button") && evt.target.firstChild)
  68.     {
  69.       evt.target.firstChild.hidePopup();
  70.     }
  71.   },
  72.  
  73.   onDrop: function (evt, dropdata, session)
  74.   {
  75.     if (dropdata.data != "")
  76.     {
  77.       creator = null;
  78.       var parElem = evt.target.parentNode;
  79.       var btmElem = evt.target;
  80.       var topElem = document.getElementById(dropdata.data);
  81.  
  82.       var classes = btmElem.getAttribute("class").split(" ");
  83.       var secondaryClass = classes[1];
  84.  
  85.       if (secondaryClass == "dragborderleft")
  86.         insertBefore(topElem.getAttribute("id"), btmElem.getAttribute("id"));
  87.       else if (secondaryClass == "dragborderright")
  88.         insertAfter(topElem.getAttribute("id"), btmElem.getAttribute("id"));
  89.       else
  90.         alert("error: drop occurred on invalid target");
  91.  
  92.       updateOrdinals();
  93.       updateSeparators();
  94.     }
  95.  
  96.     myGooglebarUtil.updateClass(evt.target, 1, "dragbordernone");
  97.   }
  98. };
  99.  
  100. var btnDragObserver = btnDragObserverOn;
  101.  
  102. function initCustomOrder()
  103. {
  104.   var element;
  105.   var parent = document.getElementById(parentID);
  106.  
  107.   customOrder = new Array(parent.childNodes.length);
  108.  
  109.   for (var i = 0; i < parent.childNodes.length; i++)
  110.   {
  111.     element = parent.childNodes[i];
  112.     customOrder[element.getAttribute("ordinal") - 1] = element.getAttribute("id");
  113.   }
  114. }
  115.  
  116. function insertAfter(topElemID, btmElemID)
  117. {
  118.   insertItem(topElemID, btmElemID, false);
  119. }
  120.  
  121. function insertBefore(topElemID, btmElemID)
  122. {
  123.   insertItem(topElemID, btmElemID, true);
  124. }
  125.  
  126. function insertItem(topElemID, btmElemID, putBefore)
  127. {
  128.   var topElemIdx = -1;
  129.   var btmElemIdx = -1;
  130.   var i;
  131.  
  132.   for (i = 0; i < customOrder.length; i++)
  133.   {
  134.     if (customOrder[i] == topElemID)
  135.     {
  136.       topElemIdx = i;
  137.       break;
  138.     }
  139.   }
  140.  
  141.   if (topElemIdx < 0)
  142.     alert("error: top element ID not found in collection");
  143.  
  144.   var removed = customOrder.splice(topElemIdx, 1);
  145.  
  146.   for (i = 0; i < customOrder.length; i++)
  147.   {
  148.     if (customOrder[i] == btmElemID)
  149.     {
  150.       btmElemIdx = i;
  151.       break;
  152.     }
  153.   }
  154.  
  155.   if (btmElemIdx < 0)
  156.     alert("error: btm element ID not found in collection");
  157.  
  158.   if (putBefore)
  159.     customOrder.splice(btmElemIdx, 1, topElemID, btmElemID);
  160.   else
  161.     customOrder.splice(btmElemIdx, 1, btmElemID, topElemID);
  162. }
  163.  
  164. function lockOrdinalOrder()
  165. {
  166.   btnDragObserver = btnDragObserverOff;
  167. }
  168.  
  169. function unlockOrdinalOrder()
  170. {
  171.   btnDragObserver = btnDragObserverOn;
  172. }
  173.  
  174. function resetOrdinals()
  175. {
  176.   for (var i = 0; i < defaultOrder.length; i++)
  177.   {
  178.     customOrder[i] = defaultOrder[i];
  179.   }
  180.  
  181.   updateOrdinals();
  182. }
  183.  
  184. function updateOrdinals()
  185. {
  186.   var element;
  187.   var parent = document.getElementById(parentID);
  188.  
  189.   for (var i = 0; i < customOrder.length; i++)
  190.   {
  191.     element = document.getElementById(customOrder[i]);
  192.     
  193.     if (!element) {
  194.         alert('error: Could not find element (' + i + ') ' + customOrder[i] + ' in current document');
  195.     }
  196.     else {
  197.         element.setAttribute("ordinal", i + 1);
  198.     }
  199.   }
  200.  
  201.   updateSeparators();
  202.  
  203.   // Need a quick little refresh due to the apparent Mozilla problem with
  204.   // rendering menu buttons in the correct order after an ordinal change
  205.   parent.setAttribute("hidden", "true");
  206.   parent.setAttribute("hidden", "false");
  207. }
  208.  
  209. function updateSeparators()
  210. {
  211.   var element, next;
  212.  
  213.   /* if a separator is next to another separator or the nav box then hide it */
  214.   for (var i = 0; i < customOrder.length - 1; i++)
  215.   {
  216.     if (/.*separator.*/.test(customOrder[i]))
  217.     {
  218.       element = document.getElementById(customOrder[i]);
  219.       next = getNextVisibleElement(i+1);
  220.       
  221.       if ((/.*separator.*/.test(next) || next == "nav-box")) {
  222.           element.setAttribute("hidden", "true");
  223.       }
  224.       else {
  225.           element.setAttribute("hidden", "false");
  226.       }
  227.     }
  228.   }
  229.  
  230.   /* if the last item is a separator then hide it */
  231.   if (/.*separator.*/.test(customOrder[customOrder.length-1]))
  232.   {
  233.     element = document.getElementById(customOrder[customOrder.length-1]);
  234.     element.setAttribute("hidden", "false");
  235.   }
  236. }
  237.  
  238. function getNextVisibleElement(start)
  239. {
  240.   var element;
  241.  
  242.   for (var i = start; i < customOrder.length; i++)
  243.   {
  244.     element = document.getElementById(customOrder[i]);
  245.  
  246.     if (element.getAttribute("hidden") == "false")
  247.     {
  248.       return customOrder[i];
  249.     }
  250.   }
  251.  
  252.   /* if no visible elements found then force the separator to be hidden */
  253.   return "fakeseparator";
  254. }
  255.